package com.xs.atm;

import java.util.ArrayList;
import java.util.Random;
import java.util.Scanner;

public class ATM_APP {
    public static void main(String[] args) {
        //定义账户
        //定义一个集合方储账户信息，方便账户的操作
        ArrayList<ATM> account=new ArrayList<>();
        //展示系统的首页
         Scanner sc=new Scanner(System.in);
        while (true) {
            System.out.println("===========中国黑心银行===========");
            System.out.println("1.账户登录");
            System.out.println("2.注册账户");
            System.out.println("\n请选择操作：");
            int command=sc.nextInt();
            switch (command){
                case 1:
                    login(account,sc);
                    //用户登录
                    break;
                case 2:
                    //用户注册
                    loginuser(account,sc);
                    break;
                default:
                    System.out.println("你输入的命令不存在");
            }
        }
    }

    /**
     * 用户登录
     * @param account 全部的账户集合
     * @param sc 扫描器
     */
    private static void login(ArrayList<ATM> account, Scanner sc) {
        System.out.println("=============================登录操作=======================");

        //判断集合中是否有账户，如果没有 则登录功能不能进行
        if (account.size()==0){
            System.out.println("对不起，当前系统中没有账户，请先开户");
            return;//卫语言风格，解决方法的执行
        }

        //进入登入操作
        while (true) {
            System.out.println("请输入卡号：");
            String cardId=sc.next();

            //判断卡号是否存在，根据卡号查询账户是否存在
            ATM acc=getATMCardId(cardId,account);
            if (acc!=null){
                //卡号存在
                //让用户输入密码
                while (true) {
                    System.out.println("请输入密码");
                    String password=sc.next();
                    //判断密码是否与账户中的密码一致
                    if (password.equals(acc.getPassWord())){
                        //登入成功
                        System.out.println("恭喜你"+acc.getUserName()+"  进入系统，你的卡号是："+acc.getCardid());
                        //展示登陆后的操作页面
                        showUserCommad(sc,acc,account);
                        return;//干掉登录方法
                    }else{
                        System.out.println("对不起您输入的密码错误");
                    }
                }
            }else{
                System.out.println("对不起,当前系统中卡号不存在");
            }
        }

    }

    /**
     * 展示操作页面
     * @param sc
     * @param acc
     */
    private static void showUserCommad(Scanner sc, ATM acc,ArrayList<ATM> account) {
        while (true) {
            System.out.println("======================用户首页======================");
            System.out.println("1.查询账户");
            System.out.println("2.存款");
            System.out.println("3.取款");
            System.out.println("4.转账");
            System.out.println("5.修改密码");
            System.out.println("6.退出");
            System.out.println("7.注销账户");
            System.out.println("请选择");
            int commad=sc.nextInt();
            switch (commad){

                case 1:
                    //查询
                    showAccount(acc);
                    break;
                case 2:
                    cunqian(acc,sc);
                    //存款
                    break;
                case 3:
                    qumoney(acc,sc);
                    //取款
                    break;
                case 4:
                    transfermoney(acc,sc,account);
                    //转账
                    break;
                case 5:
                    updatePssword(sc,acc);
                    //修改密码
                    return;
                case 6:
                    //退出
                    System.out.println("退出成功，欢迎下次光临");
                    return;//停止当前方法，跳出去
                case 7:
                    //注销账号
                   if (deleAccount(sc,account,acc)){
                       return;
                }else {
                       break;
                   }
                default:
                    System.out.println("你输入的操作命令不正确");
            }
        }
    }

    private static boolean deleAccount(Scanner sc, ArrayList<ATM> account, ATM acc) {
         //从当前集合中,删除当前账户对象,销毁
      System.out.println("你确定销毁？y/n");
      String xuanze=sc.next();
      switch (xuanze){
          case "y":
              if (acc.getMoney()>0){
                  System.out.println("你的余额不为0，请取走再来销户");
              }else{
                  account.remove(acc);
                  System.out.println("你的账户销户成功");
                  return true;
              }
              break;
              case "n":
                  System.out.println("取消销户");
      }
      return false;
    }

    private static void updatePssword(Scanner sc, ATM acc) {
        System.out.println("===========修改密码============");
        //判断密码是否正确
        while (true) {
             System.out.println("请输入当前密码：");
             String passWord=sc.next();
            if (acc.getPassWord().equals(passWord)){
                //密码正确
                System.out.println("请输入新密码：");
                String newPassWrod=sc.next();
                System.out.println("请确认密码");
                String newpassWord=sc.next();
                if (newpassWord.equals(newPassWrod)){
                    acc.setPassWord(newpassWord);
                    System.out.println("密码修改成功");
                    return;
                }else{
                    System.out.println("你输入的两次密码不一致");
                }
            }else{
                System.out.println("你输入的密码不正确");
            }
        }
    }

    /**
     * 转账
     * @param acc 银行的账户库
     * @param sc
     * @param account 当前登录的账号
     */
    private static void transfermoney(ATM acc, Scanner sc, ArrayList<ATM> account) {
        System.out.println("==============用户转账操作=============");
        //判断是否有足够的的账户
        if (account.size()<2){
            System.out.println("你当前系统中不足2个账户，请去开户");
            return;//结束当前方法
        }
        //开始转账 判断自己的账户是否有钱
        if (acc.getMoney()==0){
            System.out.println("穷逼，你都没钱想P吃呢");
            return;
        }
        //有钱，有账户，开始
        while (true) {
            System.out.println("请您输入对方账户的卡号：");
            String cardId=sc.next();
            //判断账号是否是自己的
            if (cardId.equals(acc.getCardid())){
                System.out.println("对不起，你不能给自己转账");
                continue;//结束此次循环，开始下一次
            }

            //判断卡号是否存在
            ATM atm=getATMCardId(cardId,account);
            if (atm==null){
                System.out.println("你输入的账号不存在");
            }else {
                //确认他的姓氏
                String userName=acc.getUserName();
                String tip="*"+userName.substring(1);
                System.out.println("请输入"+tip+"姓氏");
                String prename=sc.next();

                //认证姓氏是否输入正确
                if (userName.startsWith(prename)){
                    //认证通过
                    while (true) {
                        System.out.println("请输入转账金额：");
                        int money=sc.nextInt();
                        if (money>acc.getMoney()){
                            System.out.println("对不起你的余额不足，你最多能转账："+acc.getMoney());
                        }else{
                            acc.setMoney(acc.getMoney()-money);
                            atm.setMoney(atm.getMoney()+money);
                            System.out.println("转账成功,您的余额剩余为："+acc.getMoney());
                            return;//结束此方法
                        }
                    }
                }else{
                    System.out.println("对不起你输入的信息有误");
                }

            }

        }
    }

    /**
     * 取款功能
     * @param acc
     * @param sc
     */
    private static void qumoney(ATM acc, Scanner sc) {
        System.out.println("============取款功能==========");
        //当前账户是否有100元
        if (acc.getMoney()<100){
            System.out.println("对不起，您的账户余额不足100，无法取出");
            return;
        }
        while (true) {
            System.out.println("请输入你的取款金额");
            int money=sc.nextInt();

            //是否超过当次限额
            if (money>acc.getQuMoeny()){
                System.out.println("对不起，你当前取款超过单次的最大额度："+acc.getQuMoeny());

            }else {
                //没有超过单次限额
                if (money>acc.getMoney()){
                    System.out.println("您的余额不足");
                }else {
                    System.out.println("恭喜你取款成功");
                    acc.setMoney(acc.getMoney()-money);
                    //结束取款
                    showAccount(acc);
                    return;
                }
            }
        }
    }

    private static void cunqian(ATM acc, Scanner sc) {
        System.out.println("========欢迎进入存款页面=====");
        System.out.println("请您输入存款金额：");
        int money= sc.nextInt();
        //更新账户余额：原来的钱+新存入的钱
        acc.setMoney(acc.getMoney()+money);
        System.out.println("存入成功，当前账户信息如下");
        showAccount(acc);

    }

    /**
     * 展示账户信息
     * @param acc
     */
    private static void showAccount(ATM acc) {
        System.out.println("===========账户信息如下===============");
        System.out.println("卡号："+acc.getCardid());
        System.out.println("姓名："+acc.getUserName());
        System.out.println("余额："+acc.getMoney());
        System.out.println("单次取款限额："+acc.getQuMoeny());
    }

    //用户注册
    private static void loginuser(ArrayList<ATM> account,Scanner sc) {
        System.out.println("======系统注册============");
        //创建一个账户对象，用于后期封装到账户对象中去。
        ATM atm=new ATM();

        //录入当前账户信息放入账户对象
        System.out.println("请输入用户名：");
        String  username=sc.next();
        atm.setUserName(username);
        while (true) {
            System.out.println("输入密码：");
            String passwod=sc.next();
            System.out.println("请再次输入密码：");
            String twopasswod=sc.next();
            if (passwod.equals(twopasswod)){
                //认证通过，注入账户对象
                atm.setPassWord(twopasswod);
                break;
            }else{
                System.out.println("两次密码不一致,请重新输入");
            }
        }
        System.out.println("请输入档次取款最大金额：");
        double qumoney=sc.nextDouble();
        atm.setQuMoeny(qumoney);

        //随机生成8位与其他卡号不同的卡号
        String cardId=getCardId(account);
        atm.setCardid(cardId);

        //把账户对象添加到账户集合中去
        account.add(atm);
        System.out.println("欢迎你"+username+"  你开户成功，你的卡号是："+cardId+"请你好好记住");
    }

    /**
     * 生成8位卡号
     * @param account
     * @return
     */
    private static String getCardId(ArrayList<ATM> account) {
        Random r=new Random();
        while (true) {
            String card="";
            for (int i = 0; i <8 ; i++) {
                card +=r.nextInt(10);
            }

            //判断生成的卡号与其他卡号是否重复
            ATM acc=getATMCardId(card,account);
            if (acc==null){
                return card;
            }
        }
    }

    /**
     * 根据卡号查询是否有重复的卡号
     * @param cardId 卡号
     * @param account 账户集合
     * @return 账户对象 | null
     */

    public static ATM getATMCardId(String cardId,ArrayList<ATM> account){
        for (int i = 0; i < account.size(); i++) {
            ATM acc=account.get(i);
            if (acc.getCardid().equals(cardId)){
                return acc;
            }
        }
        return null;
    }

}
